#ifndef FPLAYER_JNIHELPER_H
#define FPLAYER_JNIHELPER_H

#include <jni.h>
#include "CommonDefine.h"

/**
 * author: x-fan
 * date: 2024/1/18
 * desc: JNI工具类
 */
class JNIHelper {
private:
  //JavaVM 虚拟机
  JavaVM *_pJavaVM = nullptr;
  //Context
  jobject _pContext = nullptr;

  static JNIHelper *pInstance;

  JNIHelper() = default;

  JNIHelper(const JNIHelper &) = default; //禁止复制构造函数

public:
  virtual ~JNIHelper();

  static JNIHelper *Instance();

  static void Destroy();

  /**
   * 初始化虚拟机
   * @param pVM 虚拟机
   */
  void setJavaVM(JavaVM *pVM);

  JavaVM *getJavaVM();

  /**
   * 设置应用上下文
   * @param pContext 上下文
   */
  void setContext(jobject pContext);

  /**
   * @return 获取应用上下文
   */
  jobject getContext();

  /**
   * 通过JavaVM获取JNIEnv对象
   * @param version JNI版本 默认1.4
   * @return JNIEnv对象
   */
  JNIEnv *getEnv(jint version = JNI_VERSION_1_4);

  /**
   * 创建的线程没有JNI环境，如果想拥有JNI环境，则需要附加到虚拟机上
   * @return 当前线程的JNI环境，JNIEnv对象
   */
  JNIEnv *attachThread();

  /**
   * 将当前线程从虚拟机中分离出来
   */
  void detachThread();
};


#endif //FPLAYER_JNIHELPER_H
